package handler

import (
	"net/http"

	"vod-service/config" // 替换为实际项目路径

	"github.com/gin-gonic/gin"
	"github.com/volcengine/volc-sdk-golang/service/vod/models/request"
)

// ------------------------------ 临时播放 Token 相关 ------------------------------

// 1. 签发临时播放 Token 请求参数
type GetPlayAuthTokenRequest struct {
	Vid             string `form:"vid" binding:"required"`             // 视频ID
	TokenExpireTime int    `form:"token_expire_time" binding:"min=60"` // Token过期时间（秒，最小60）
	Format          string `form:"format,omitempty"`                   // 格式（如mp4、hls）
	Codec           string `form:"codec,omitempty"`                    // 编码（如h264、h265）
	Definition      string `form:"definition,omitempty"`               // 清晰度（如sd、hd）
	FileType        string `form:"file_type,omitempty"`                // 文件类型
	LogoType        string `form:"logo_type,omitempty"`                // 水印类型
	Ssl             string `form:"ssl,omitempty"`                      // 是否HTTPS（1/0）
	NeedThumbs      string `form:"need_thumbs,omitempty"`              // 是否需要封面
	UnionInfo       string `form:"union_info,omitempty"`               // 设备唯一信息（私有加密用）
	DrmKEK          string `form:"drm_kek,omitempty"`                  // 加密公钥（私有加密用）
	JSPlayer        string `form:"js_player,omitempty"`                // 是否JS播放器（1/0）
}

// 签发临时播放 Token
func GetPlayAuthTokenHandler(c *gin.Context) {
	var req GetPlayAuthTokenRequest
	if err := c.ShouldBindQuery(&req); err != nil {
		c.JSON(http.StatusBadRequest, config.Response{
			Code:    http.StatusBadRequest,
			Message: "参数错误: " + err.Error(),
		})
		return
	}

	// 构建请求参数
	query := &request.VodGetPlayInfoRequest{
		Vid:        req.Vid,
		Format:     req.Format,
		Codec:      req.Codec,
		Definition: req.Definition,
		FileType:   req.FileType,
		LogoType:   req.LogoType,
		Ssl:        req.Ssl,
		NeedThumbs: req.NeedThumbs,
		UnionInfo:  req.UnionInfo,
		DrmKEK:     req.DrmKEK,
		JSPlayer:   req.JSPlayer,
	}

	// 签发Token
	token, err := config.GetVodInstance().GetPlayAuthToken(query, req.TokenExpireTime)
	if err != nil {
		c.JSON(http.StatusInternalServerError, config.Response{
			Code:    http.StatusInternalServerError,
			Message: "签发临时播放Token失败: " + err.Error(),
		})
		return
	}

	c.JSON(http.StatusOK, config.Response{
		Code:    http.StatusOK,
		Message: "success",
		Data:    gin.H{"play_auth_token": token},
	})
}

// 2. 获取播放地址请求参数
type GetPlayInfoRequest struct {
	Vid        string `form:"vid" binding:"required"` // 视频ID
	Format     string `form:"format,omitempty"`       // 格式（如mp4、hls）
	Codec      string `form:"codec,omitempty"`        // 编码（如h264、h265）
	Definition string `form:"definition,omitempty"`   // 清晰度（如sd、hd）
	FileType   string `form:"file_type,omitempty"`    // 文件类型
	LogoType   string `form:"logo_type,omitempty"`    // 水印类型
	Ssl        string `form:"ssl,omitempty"`          // 是否HTTPS（1/0）
	NeedThumbs string `form:"need_thumbs,omitempty"`  // 是否需要封面
}

// 获取播放地址
func GetPlayInfoHandler(c *gin.Context) {
	var req GetPlayInfoRequest
	if err := c.ShouldBindQuery(&req); err != nil {
		c.JSON(http.StatusBadRequest, config.Response{
			Code:    http.StatusBadRequest,
			Message: "参数错误: " + err.Error(),
		})
		return
	}

	// 构建请求参数
	query := &request.VodGetPlayInfoRequest{
		Vid:        req.Vid,
		Format:     req.Format,
		Codec:      req.Codec,
		Definition: req.Definition,
		FileType:   req.FileType,
		LogoType:   req.LogoType,
		Ssl:        req.Ssl,
		NeedThumbs: req.NeedThumbs,
	}

	// 获取播放信息
	resp, _, err := config.GetVodInstance().GetPlayInfo(query)
	if err != nil {
		c.JSON(http.StatusInternalServerError, config.Response{
			Code:    http.StatusInternalServerError,
			Message: "获取播放地址失败: " + err.Error(),
		})
		return
	}

	c.JSON(http.StatusOK, config.Response{
		Code:    http.StatusOK,
		Message: "success",
		Data:    resp,
	})
}

// ------------------------------ 私有加密 Token 相关 ------------------------------

// 3. 签发私有加密 Token 请求参数
type GetPrivateDrmAuthTokenRequest struct {
	Vid             string `form:"vid" binding:"required"`             // 视频ID
	TokenExpireTime int    `form:"token_expire_time" binding:"min=60"` // Token过期时间（秒，最小60）
	DrmType         string `form:"drm_type" binding:"required"`        // 加密类型（固定为"webdevice"）
	PlayAuthIds     string `form:"play_auth_ids" binding:"required"`   // 播放权限ID列表（逗号分隔）
	UnionInfo       string `form:"union_info" binding:"required"`      // 设备唯一信息
}

// 签发私有加密 Token
func GetPrivateDrmAuthTokenHandler(c *gin.Context) {
	var req GetPrivateDrmAuthTokenRequest
	if err := c.ShouldBindQuery(&req); err != nil {
		c.JSON(http.StatusBadRequest, config.Response{
			Code:    http.StatusBadRequest,
			Message: "参数错误: " + err.Error(),
		})
		return
	}

	// 构建请求参数
	query := &request.VodGetPrivateDrmPlayAuthRequest{
		Vid:         req.Vid,
		DrmType:     req.DrmType,
		PlayAuthIds: req.PlayAuthIds,
		UnionInfo:   req.UnionInfo,
	}

	// 签发私有加密Token
	token, err := config.GetVodInstance().GetPrivateDrmAuthToken(query, req.TokenExpireTime)
	if err != nil {
		c.JSON(http.StatusInternalServerError, config.Response{
			Code:    http.StatusInternalServerError,
			Message: "签发私有加密Token失败: " + err.Error(),
		})
		return
	}

	c.JSON(http.StatusOK, config.Response{
		Code:    http.StatusOK,
		Message: "success",
		Data:    gin.H{"private_drm_auth_token": token},
	})
}

// ------------------------------ HLS 标准加密相关 ------------------------------

// 4. 签发 HLS 标准加密 Token 请求参数
type GetSha1HlsDrmAuthTokenRequest struct {
	TokenExpireTime int64 `form:"token_expire_time" binding:"min=60"` // Token过期时间（秒，最小60）
}

// 签发 HLS 标准加密 Token
func GetSha1HlsDrmAuthTokenHandler(c *gin.Context) {
	var req GetSha1HlsDrmAuthTokenRequest
	if err := c.ShouldBindQuery(&req); err != nil {
		c.JSON(http.StatusBadRequest, config.Response{
			Code:    http.StatusBadRequest,
			Message: "参数错误: " + err.Error(),
		})
		return
	}

	// 签发HLS标准加密Token
	token, err := config.GetVodInstance().CreateSha1HlsDrmAuthToken(req.TokenExpireTime)
	if err != nil {
		c.JSON(http.StatusInternalServerError, config.Response{
			Code:    http.StatusInternalServerError,
			Message: "签发HLS标准加密Token失败: " + err.Error(),
		})
		return
	}

	c.JSON(http.StatusOK, config.Response{
		Code:    http.StatusOK,
		Message: "success",
		Data:    gin.H{"hls_drm_auth_token": token},
	})
}

// 5. 创建 HLS 标准加密密钥请求参数
type CreateHlsDecryptionKeyRequest struct {
	SpaceName string `form:"space_name" binding:"required"` // 空间名称
}

// 创建 HLS 标准加密密钥
func CreateHlsDecryptionKeyHandler(c *gin.Context) {
	var req CreateHlsDecryptionKeyRequest
	if err := c.ShouldBindQuery(&req); err != nil {
		c.JSON(http.StatusBadRequest, config.Response{
			Code:    http.StatusBadRequest,
			Message: "参数错误: " + err.Error(),
		})
		return
	}

	// 构建请求参数
	query := &request.VodCreateHlsDecryptionKeyRequest{
		SpaceName: req.SpaceName,
	}

	// 创建HLS加密密钥
	resp, _, err := config.GetVodInstance().CreateHlsDecryptionKey(query)
	if err != nil {
		c.JSON(http.StatusInternalServerError, config.Response{
			Code:    http.StatusInternalServerError,
			Message: "创建HLS标准加密密钥失败: " + err.Error(),
		})
		return
	}

	c.JSON(http.StatusOK, config.Response{
		Code:    http.StatusOK,
		Message: "success",
		Data:    resp,
	})
}

// 注册播放相关路由
func RegisterPlayRoutes(r *gin.Engine) {
	playGroup := r.Group("/api/v1/play")
	{
		// 临时播放Token
		playGroup.GET("/auth-token", GetPlayAuthTokenHandler)
		// 播放地址
		playGroup.GET("/info", GetPlayInfoHandler)
		// 私有加密Token
		playGroup.GET("/private-drm-token", GetPrivateDrmAuthTokenHandler)
		// HLS标准加密Token
		playGroup.GET("/hls-drm-token", GetSha1HlsDrmAuthTokenHandler)
		// 创建HLS加密密钥
		playGroup.POST("/hls-key", CreateHlsDecryptionKeyHandler)
	}
}
